unit CaixaDM;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ZDataset, ZSqlUpdate, ZSequence, MainDM, DB, QueryConditions;

type

  { TCaixaMovimentacaoData }

  TCaixaMovimentacaoData = class(TMainDataModule)
    CaixaMovDatasource: TDatasource;
    CaixaMovZQuery: TZQuery;
    CaixaMovZQuerydata_fim: TDateField;
    CaixaMovZQuerydata_inicio: TDateField;
    CaixaMovZQueryhora_fim: TTimeField;
    CaixaMovZQueryhora_inicio: TTimeField;
    CaixaMovZQueryid_caixa_movimentacao: TLargeintField;
    CaixaMovZQueryid_conta: TLargeintField;
    CaixaMovZQueryid_usuario: TLargeintField;
    CaixaMovZQuerysaldo: TFloatField;
    CaixaMovZQuerystatus: TStringField;
    CaixaMovZQueryvalor_final: TFloatField;
    CaixaMovZQueryvalor_inicial: TFloatField;
    CaixaMovZSequence: TZSequence;
    CaixaMovZUpdate: TZUpdateSQL;
    AuxiliarZQuery: TZQuery;
    TotalDatasource: TDatasource;
    ReceitaDespesaZQuerydata: TDateField;
    ReceitaDespesaZQuerydesc_plano_conta: TStringField;
    ReceitaDespesaZQueryhora: TTimeField;
    ReceitaDespesaZQueryid_caixa_movimentacao: TLargeintField;
    ReceitaDespesaZQueryid_conta: TLargeintField;
    ReceitaDespesaZQueryid_plano_conta: TLargeintField;
    ReceitaDespesaZQueryid_plano_conta_movimentacao: TLargeintField;
    ReceitaDespesaZQueryid_usuario: TLargeintField;
    ReceitaDespesaZQuerytipo: TStringField;
    ReceitaDespesaZQueryvalor: TFloatField;
    VendasDatasource: TDatasource;
    ReceitaDespesaDatasource: TDatasource;
    VendaDatasource: TDatasource;
    VendasZQuerydesc_forma_pagamento: TStringField;
    VendasZQueryid_caixa_movimentacao: TLargeintField;
    VendasZQueryid_usuario: TLargeintField;
    VendasZQueryid_venda: TLargeintField;
    VendasZQuerysigla_forma_pagamento: TStringField;
    VendasZQueryvalor: TFloatField;
    VendaZQuery: TZQuery;
    VendasZQuery: TZQuery;
    ReceitaDespesaZQuery: TZQuery;
    TotalZQuery: TZQuery;
    VendaZQueryacrescimo: TFloatField;
    VendaZQuerydata: TDateField;
    VendaZQuerydesconto: TFloatField;
    VendaZQueryhora: TTimeField;
    VendaZQueryid_cliente: TLargeintField;
    VendaZQueryid_condicao_pagamento: TLargeintField;
    VendaZQueryid_garcon: TLargeintField;
    VendaZQueryid_mesa: TLargeintField;
    VendaZQueryid_usuario: TLargeintField;
    VendaZQueryid_venda: TLargeintField;
    VendaZQuerynome_pessoa: TStringField;
    VendaZQuerysigla_forma_pagamento: TStringField;
    VendaZQuerystatus_cliente: TStringField;
    VendaZQueryvalor: TFloatField;
    VendaZQueryvalor_total: TFloatField;
    procedure DataModuleCreate(Sender: TObject);
    /// Abre o DataSet
    procedure OpenDataSet(); override;
    /// Fecha o DataSet
    procedure CloseDataSet(); override;
    /// Realiza busca
    /// @param(Condicoes são as condições para a busca)
    /// @param(Tabela é a tabela no banco de dados)
    procedure Search(Condicoes: TQueryConditions; Tabela: string);
    function BuscaSaldoConta(IDConta: string): string;
    function VerificaCaixaAberto(): string;
    function BuscaTotalSaidaCaixa(IDCaixa: string): string;
    function BuscaTotalEntradaCaixa(IDCaixa: string): string;
    procedure BuscaValoresPrincipais(IDCaixa:string);
    function BuscaData(): string;
    function BuscaHora(): string;
    procedure BuscaValoresTotaisVenda(IDCaixa:string);
    procedure BuscaVendas(IDCaixa: string);
    procedure BuscaVendasVazio();
    function VerificaCaixaConta(IDConta: string): boolean;
    procedure BuscaDadosCaixaMainFrame();
    function BuscaSaldoContaCaixa(IDCaixa:string):string;
  end;

var
  CaixaMovimentacaoData: TCaixaMovimentacaoData;

implementation

uses ConnectionDM, MainFm, CaixaFr;

{ TCaixaMovimentacaoData }

procedure TCaixaMovimentacaoData.DataModuleCreate(Sender: TObject);
begin
  MainDataSet := CaixaMovZQuery;
end;

procedure TCaixaMovimentacaoData.OpenDataSet;
begin
  ConnectionData.EmptyQuery(CaixaMovZQuery, 'caixa_movimentacao');
end;

procedure TCaixaMovimentacaoData.CloseDataSet;
begin
  VendaZQuery.Close();
  CaixaMovZQuery.Close();
end;

procedure TCaixaMovimentacaoData.Search(Condicoes: TQueryConditions; Tabela: string);
begin
  ConnectionData.OpenQueryConditions(CaixaMovZQuery, Tabela, Condicoes);
end;

function TCaixaMovimentacaoData.BuscaSaldoConta(IDConta: string): string;
var
  Saldo: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select c.saldo ');
    SQL.Add('FROM conta as c');
    SQL.Add('where id_conta=:id_conta ');
    ParamByName('id_conta').AsString := IDConta;
    Open();
    Saldo := FieldByName('saldo').AsString;
    if (Saldo <> '') then begin
      Result := Saldo;
    end else begin
      Result := '0';
    end;
  end;
end;

//Verifica se o caixa está aberto e retorna o ID do caixa
function TCaixaMovimentacaoData.VerificaCaixaAberto(): string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select cm.id_caixa_movimentacao');
    SQL.Add('FROM caixa_movimentacao as cm, conta as c');
    SQL.Add('where cm.id_conta=c.id_conta AND c.computador=:computador AND cm.status=:status');
    ParamByName('computador').AsString := MainForm.Maquina;
    ParamByName('status').AsString := 'A';
    Open();
    if (RecordCount > 0) then begin
      Result := FieldByName('id_caixa_movimentacao').AsString;
    end else begin
      Result := '';
    end;
  end;
end;

//Função que vai Buscar a soma dos Valores da Saída do Caixa
function TCaixaMovimentacaoData.BuscaTotalSaidaCaixa(IDCaixa: string): string;
var
  despesa: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT sum(pcm.valor)as despesa');
    SQL.Add('FROM plano_conta_movimentacao as pcm, plano_conta as pc');
    SQL.Add('WHERE pcm.id_caixa_movimentacao =:id_caixa_movimentacao AND pcm.id_plano_conta=pc.id_plano_conta');
    SQL.Add('AND pc.tipo=:tipo');
    ParamByName('id_caixa_movimentacao').AsString := IDCaixa;
    ParamByName('tipo').AsString := 'D';
    Open();
    Edit();
    if RecordCount > 0 then begin
      despesa := FieldByName('despesa').AsString;
      Result := despesa;
    end else begin
      Result := '0';
    end;
  end;
end;

//Função que vai Buscar a soma dos Valores da Entradas do Caixa
function TCaixaMovimentacaoData.BuscaTotalEntradaCaixa(IDCaixa: string): string;
var
  receita: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT sum(pcm.valor)as receita');
    SQL.Add('FROM plano_conta_movimentacao as pcm, plano_conta as pc');
    SQL.Add('WHERE pcm.id_caixa_movimentacao =:id_caixa_movimentacao AND pcm.id_plano_conta=pc.id_plano_conta');
    SQL.Add('AND pc.tipo=:tipo');
    ParamByName('id_caixa_movimentacao').AsString := IDCaixa;
    ParamByName('tipo').AsString := 'R';
    Open();
    Edit();
    if RecordCount > 0 then begin
      receita := FieldByName('receita').AsString;
      Result := receita;
    end else begin
      Result := '0';
    end;
  end;
end;

procedure TCaixaMovimentacaoData.BuscaValoresPrincipais(IDCaixa: string);
begin
  //Busca as Vendas para o Caixa
  with VendasZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select fp.desc_forma_pagamento, cv.*');
    SQL.Add('FROM caixa_venda as cv, forma_pagamento as fp');
    SQL.Add('WHERE fp.sigla_forma_pagamento = cv.sigla_forma_pagamento');
    SQL.Add('AND cv.id_caixa_movimentacao=:id_caixa_movimentacao');
    ParamByName('id_caixa_movimentacao').AsString:=IDCaixa;
    Open();
  end;
  //Busca as receitas e despesas do caixa
  with ReceitaDespesaZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select pc.desc_plano_conta,pc.tipo, pcm.*');
    SQL.Add('from plano_conta_movimentacao as pcm,plano_conta as pc');
    SQL.Add('WHERE pc.id_plano_conta = pcm.id_plano_conta');
    SQL.Add('AND id_caixa_movimentacao=:id_caixa_movimentacao');
    ParamByName('id_caixa_movimentacao').AsString := IDCaixa;
    Open();
  end;
  //Busca os dados do Caixa
  with CaixaMovZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select cm.*');
    SQL.Add('FROM caixa_movimentacao as cm');
    SQL.Add('WHERE cm.id_caixa_movimentacao=:id_caixa_movimentacao');
    ParamByName('id_caixa_movimentacao').AsString := IDCaixa;
    Open();
    Edit();
  end;
end;

function TCaixaMovimentacaoData.BuscaData(): string;
var
  Data: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT current_date as date');
    Open();
    Edit();
    Data := FieldByName('date').AsString;
    Result := Data;
  end;
end;

function TCaixaMovimentacaoData.BuscaHora: string;
var
  Data: String;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT current_time as time');
    Open();
    Edit();
    Data := FieldByName('time').AsString;
    Result := Data;
  end;
end;

procedure TCaixaMovimentacaoData.BuscaValoresTotaisVenda(IDCaixa: string);
begin
   with TotalZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select sigla_forma_pagamento, sum(valor) as total From caixa_venda');
    SQL.Add('WHERE id_caixa_movimentacao =:id_caixa_movimentacao group by sigla_forma_pagamento');
    ParamByName('id_caixa_movimentacao').AsString := IDCaixa;
    Open();
   end;
end;

procedure TCaixaMovimentacaoData.BuscaVendas(IDCaixa: string);
begin
  with VendaZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select p.nome_pessoa, f.desc_forma_pagamento, v.* from venda as v, caixa_venda as cv, pessoa as p, forma_pagamento as f');
    SQL.Add('where cv.id_caixa_movimentacao=:id_caixa_movimentacao AND v.id_venda = cv.id_venda AND v.id_cliente=p.id_pessoa AND f.sigla_forma_pagamento = v.sigla_forma_pagamento');
    ParamByName('id_caixa_movimentacao').AsString := IDCaixa;
    Open();
  end;
end;

procedure TCaixaMovimentacaoData.BuscaVendasVazio;
begin
   with VendaZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select * from venda limit 0 ');
    Open();
  end;
end;

function TCaixaMovimentacaoData.VerificaCaixaConta(IDConta: string): boolean;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select c.saldo, c.abre_caixa ');
    SQL.Add('FROM conta as c');
    SQL.Add('where c.id_conta=:id_conta AND c.computador=:computador AND c.status=:status');
    ParamByName('computador').AsString := MainForm.Maquina;
    ParamByName('status').AsString := 'A';
    ParamByName('id_conta').AsString := IDConta;
    Open();
    if RecordCount > 0 then begin
      if FieldByName('abre_caixa').AsString = 'S' then begin
        CaixaMovZQuery.FieldByName('valor_inicial').AsFloat :=
          FieldByName('saldo').AsFloat;
        Result := True;
      end else begin
        Result := False;
      end;
    end else begin
      Result := False;
    end;
  end;
end;

procedure TCaixaMovimentacaoData.BuscaDadosCaixaMainFrame();
var
  IDCaixa:string;
begin
   IDCaixa:=VerificaCaixaAberto();
   if IDCaixa <> '' then begin
     BuscaValoresPrincipais(IDCaixa);
     BuscaSaldoContaCaixa(IDCaixa);
   end;
end;

function TCaixaMovimentacaoData.BuscaSaldoContaCaixa(IDCaixa: string): string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select c.saldo from conta as c, caixa_movimentacao as cm ');
    SQL.Add('where c.id_conta=cm.id_conta AND cm.id_caixa_movimentacao=:id');
    ParamByName('id').AsString:=IDCaixa;
    Open();
    CaixaMovZQuery.FieldByName('saldo').AsString:=FieldByName('saldo').AsString;
    Result:= FieldByName('saldo').AsString;
  end;
end;

initialization
  {$I caixadm.lrs}

end.
